
#4.22 实习三
#向量，一维数据；矩阵，二维数据；列表，数组  多维数据
#向量
A=c(1:10)     #小写c赋值
print(A)
B=seq(from=a,to=b,by=c) #从a到b,间隔为c
C=rep(0,5)         #重复5个0

#修改向量函数
A[-3]   #删除（用减号）第三个
A[-c(7,8)]  #同时删除第七，第8个
A[A<5]          #输出A向量里面值小于五的所有数
B=seq(from=1,to=10,by=2)
print(B[B<5])

#数值型向量函数常用的函数sum,max,sort，mean
#Inf -Inf  无穷数
#NA not available   缺失值--某个数值不可利用
#NaN not a number   缺失值--某个值不是一个数
#NULL  空值,不是缺失值

#字符型
#字符串处理函数：
#strsplit()分割,paste()及paste0()字符串连接
#length()向量长度；nchar()字符串长度

#逻辑型   TRUE、FALSE、NA

#一维数据--因子
#factor(x=character(),levels,labels=levels,exclude=NA,
#      ordered=is.ordered(x),nmax=NA)
#levels:用于指定因子可能的水平
#labels:用来指定水平的名字
#exclude:表示从向量x中剔除的水平值

#tapply()   基于因子的运算
gender=c('f','m','f')
age=c(10,11,12)
tapply(age,gender,mean)

#1.一维数据练习 马一诺
score=sample(85:100,10,replace=TRUE) #数值向量
group=c('富强','民主','和谐','民主','和谐','民主','民主','和谐','富强','富强')
group2=factor(group)
tapply(score,group,mean)
print(score)

factor(group,levels = '富强','民主','和谐',labels = 'A','B','C')
#将富强民主和谐换成A,B,C

#判断数据类型  is.double()
#转换数据类型  as.numeric()  转换成数值型

#二维--矩阵（里边数据类型一样）
mat=matrix(c(1:12),nrow,ncol=4)  #3行4列
#维数获取：dim()
#*  矩阵与标量×
#  %*%    矩阵之间×

#二维数据--数据框（里边可多种数据类型，但同一列数据类型相同）
dat=data.frame()
#$  数据框的每一列都有索引
#A$a  即数据框A的第a列
#rbind()  行合并，要求列相同    
#cbind()   列合并，要求行相同
#merge()  连接


#2.二维数据练习，马一诺，法1
score_R=sample(90:100,10,replace=TRUE) #数值向量2
score_python=sample(60:80,10,replace=TRUE)#数值向量3
d=data.frame(
  R分数=score_R,
  python分数=score_python,
  c语言分数=score,
  小组组别=group,
  stringsAsFactors=FALSE
)
knitr::kable(d)    #表格格式输出

#法2
data=cbind(score,score_R)
data2=cbind(data,score_python)
data3=cbind(data2,group)
knitr::kable(data3)    #表格格式输出

#法3
dataa=rbind(score,score_R)
datab=rbind(dataa,score_python)
datac=rbind(datab,group)
knitr::kable(datac)    #表格格式输出

#法2
data=cbind(score,score_R)
data2=cbind(data,score_python)
data3=cbind(data2,group2)
print(data3)    #表格格式输出

#函数
#形式： 变量名=function(变量列表) {函数体}

#输入输出

#路径
getwd()    #当前路径
setwd("")    #设置新路径，路径中的\要改成/
setwd
dir.create("路径/文件夹名")  #新建一个文件夹
list.files("路径")     #查询路径下的所有文件 
#3.2需要 可以专门读csv
#获取所有文件名、数据合并、删除多余信息


#read.table  read.csv  不能read.excel需要安装专用包   读
#write.table       写
#save.image(file="文件夹名")  把所有变量存进文件夹
#load()
#读文件前需要先确定文件类型和分隔符再进行读取。

#3文件的读入读出

#########
if(! require("openxlsx")) install.packages("openxlsx")
if(! require("readr")) install.packages("readr")  #安装readr包
library(readr)
setwd("C:/Users/34863/Desktop/data for class3")    #设置新路径
d2=read_csv("ADdata2.csv",locale=locale(encoding="GBK"))
d1=read_tsv("ADdata1.txt",col_names=FALSE)
d4=read_table2("ADdata4.txt")
if(! require("Rcpp")) install.packages("Rcpp")
library(openxlsx)
d3=read.xlsx("ADdata3.xlsx")
d6=read.csv("ADdata2.csv")
d5=read.delim("ADdata1.txt",header = TRUE,col_names = FALSE)

d8=data.frame(read.table("ADdata4.txt",header=TRUE))
names(d1)
names(d4)              #读取所有列索引
rownames(d8)           #读取所有行索引
names(d8)
names(d6)[1]=''
m1=merge(d5,d6,by.x='',by.y='')
m2=merge(d5,d6)
help(names)
###########   以上均为学习摸索的训练代码，下方为解题思路

# 3.1 读取并合并文件 马一诺
#① merge函数为主
#思路：依次读入四个文件后，找到共有列索引作为合并依据合并
#
library(openxlsx)            #掉包
setwd("C:/Users/34863/Desktop/data for class3")    #设置新路径
d1=read.delim("ADdata1.txt")
d2=read.csv("ADdata2.csv")
d3=read.xlsx("ADdata3.xlsx")
d4=read.table("ADdata4.txt",header=TRUE)
#读取列索引,可见列数和基因列索引各不相同，这是因为数据源首行首列为空导致
names(d1)
names(d2)
names(d3)
names(d4)
#思路，将基因名列添加数据框的一列，并将该列列索引统一为"X"
rowindex1=rownames(d1)      #读取行索引
rowindex4=rownames(d4)
d1new=cbind(d1,rowindex1)    #利用cbind函数将基因名添加至数据框
d4new=cbind(d4,rowindex4)    
names(d1new)[17]="X"         #统一基因名列索引
names(d4new)[17]="X"
names(d3)[1]="X"
#merge（）函数合并
data1=merge(d1new,d4new,by.x = "X",by.y = "X")
data2=merge(d3,d2,by.x = "X",by.y="X")
data3=merge(data1,data2,by.x="X",by.y="X")
#输出
write.csv(data3, file = "outcome1.csv")
write.table(data3, file = "outcome2.txt")
write.table(data3, file = "outcome3.xlsx")
#讨论：为了用R解决首行首列为空花费了不少时间，其实用excel等软件交互式的
#操作可以更便捷的添加字段，另外全部的整合过程excel也只需要导入数据，基因名排序，
#删除重复列三步即可。

#②cbind(),
#思路：直接按基因名列排序然后cbind，最后去除多余基因列
data4=cbind(d1new[order(d1new$X),],d4new[order(d4new$X),],d2[order(d2$X),]
            ,d3[order(d3$X),])    #这里要加，

#找出并去除重复列
names(data4)    #得到分别为17，34，35，52列
data5=data4[c(-34,-35,-52)]


#3.2需要 可以专门读csv  马一诺
#获取所有文件名、数据合并、删除多余信息
#获取所有文件名
filename=list.files("C:/Users/34863/Desktop/data for class3/GSE67835")
setwd("C:/Users/34863/Desktop/data for class3/GSE67835")    #设置新路径
num_old=read.csv(filename[2])
for(n in 3:139)                         #循环读入所有csv文件并连接
{num_new=read.csv(filename[n])
num_old=cbind(num_old,num_new)
}
#读入整理好的tissue、age、type文件，我是用excel完成整理步骤的。
add=read.csv("140.csv",header=FALSE)       #读新文件
add[1,1]="cell type: astrocytes"  
#这里不知道怎么回事首行首列首字符变成了奇怪的格式，因此重新改了一下
row_add=names(num_old)                 #取列名
names(add)=row_add                     #统一列索引
finalfile=rbind(num_old,add)           #整合,要先统一下列名
library(openxlsx)
write.xlsx(finalfile,"outcome1.xlsx")

